package com.yanggu.scala.chapater06.oop

import scala.beans.BeanProperty

object ConstructorDemo01 {

  def main(args: Array[String]): Unit = {
    //scala中存在主构造方法和辅构造方法。同时辅助构造方法使用def this(参数列表)进行显示声明。
    //同时辅助构造方法必须显示调用主构造方法
    //同时主构造方法中的所有代码都会执行。这和java是不一样的地方。scala的构造方法也是方法可以执行
    //可以在主构造方法的()前面加上private表示私有。那么主构造方法外界就不能使用了。只能通过辅助构造方法调用主构造方法。
    //val person = new Person("张三", 20)
    //println(person)
    val person1 = new Person("赵六")
    println(person1.getAge)
    println(person1)
  }

}

//如果主构造器加了private关键字那么表示主构造器外部不能访问, 只能访问辅助构造器
class Person private(initName: String, initAge: Int) {

  //可以在成员变量前面加上@BeanProperty注解。可以生成getterXXX()和setterXXX()方法, 符合JavaBean的规范
  @BeanProperty
  var name: String = initName

  @BeanProperty
  var age: Int = initAge

  println("主构造方法被调用了111111")

  //辅助构造器必须使用this定义
  def this(name2: String) {
    //辅助构造器必须在代码第一行显示或者隐士(调用其他辅助构造)调用主构造器方法
    this("王五", 20)
    println("name2" + name2)
  }

  println("主构造方法被调用了222222")

  override def toString = s"Person($name, $age)"
}